﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace LibMiniBlog
{
    /// <summary>
    /// 特定のミニブログの機能を呼び出す抽象基本クラスです。
    /// </summary>
    public abstract class MiniBlogClient
    {
        /// <summary>
        /// オーバーライドされるとミニブログの名称を返します。
        /// </summary>
        public static string Name { get; protected set; }

        /// <summary>
        /// オーバーライドされるとミニブログの2文字程度の略称を返します。
        /// </summary>
        public static string AbbreviatedName { get; protected set; }

        /// <summary>
        /// APIで使用される認証情報を取得または設定します。
        /// </summary>
        public NetworkCredential Credentional { get; set; }

        /// <summary>
        /// APIで使用されるクライアントの名称を取得または設定します。
        /// </summary>
        public string ClientName { get; set; }

        /// <summary>
        /// APIで使用されるユーザーエージェントの名称を取得または設定します。
        /// </summary>
        public string UserAgent { get; set; }

        /// <summary>
        /// オーバーライドされるとタイムラインのコレクションを返します。
        /// </summary>
        public IList<Timeline> Timelines { get; protected set; }

        /// <summary>
        /// オーバーライドされるとユーザリストのコレクションを返します。
        /// </summary>
        public IList<UserList> UserLists { get; protected set; }

        /// <summary>
        /// オーバーライドされると既定のタイムラインのステータスを更新します。
        /// </summary>
        /// <param name="status">ステータス文字列</param>
        /// <returns>結果のステータスコード</returns>
        public abstract HttpStatusCode UpdateStatus(string status);

        /// <summary>
        /// オーバーライドされると指定されたタイムラインのステータスを更新します。
        /// </summary>
        /// <param name="status">ステータス文字列</param>
        /// <param name="tl"></param>
        /// <exception cref="System.InvalidArgumentException">tlがTimelinesに含まれないか投稿不可能なTimelineのときスローされます。</exception>
        /// <returns></returns>
        public abstract HttpStatusCode UpdateTimelineStatus(string status, Timeline tl);

        /// <summary>
        /// オーバーライドされると指定したユーザを購読します。
        /// </summary>
        /// <param name="loginId">購読するユーザのログインID</param>
        /// <returns></returns>
        public abstract HttpStatusCode CreateFollow(string loginId);

        /// <summary>
        /// オーバーライドされると指定したユーザを購読解除します。
        /// </summary>
        /// <param name="loginId">購読解除するユーザのログインID</param>
        /// <returns></returns>
        public abstract HttpStatusCode DestroyFollow(string loginId);
    }
}
